import axios from "axios";
import storage from "./storage";

// 定义常量，不变的字符串（如果数量多，新建js去管理）
const TOKEN_ERROR = "认证失败或token过期";
const NETWORK_ERROR = "请求超时";
import config from "../config";
// import store from "../store";
const service = axios.create({
  baseURL: config.baseUrl,
  timeout: 8000,
});

// get post
// 重要功能：拦截器 interceptor
// 作用：把请求和响应拆分更加细致，为了给程序有添加操作的机会
// 使用场景：在请求拦截的过程中添加token
//          在响应拦截的过程中统一拦截错误处理
// 怎么操作
// 1.添加一个拦截器(出去)
service.interceptors.request.use((config) => {
  // config 请求配置
  // 注意一定要返回，请求才能正常进行 config.headers
  let headers = config.headers;
  const token = storage.getItem("userInfo").token || "";
  if (!headers.Authorization) {
    headers.Authorization = "Bearer " + token;
  }
  return config;
});
// 2.添加一个响应拦截器(回来)
service.interceptors.response.use((res) => {
  // res 请求响应内容
  // 响应拦截处理
  const { code, data, msg } = res.data;
  if (code == 200) {
    // 如果code成功 直接返回数据到客户端即可
    return data;
  } else if (code === 40001) {
    // 错误提示
    console.log(TOKEN_ERROR);
    // 返回一个，外面可以捕获错误的对象
    // 所以要返回一个promise的错误对象
    return Promise.reject(TOKEN_ERROR);
  } else {
    // 如果进入该分支，说明没有code
    // 请求超过我们的timeout
    console.log(NETWORK_ERROR);
    return Promise.reject(NETWORK_ERROR);
  }
});

// 封装各类请求
// get post 两个的参数
function request(options) {
  options.method = options.method || "get";
  // get params post data
  if (options.method === "get") {
    options.params = options.data;
  }
  return service(options);
}

const requestList = ["get", "post"];

requestList.forEach((item) => {
  request[item] = (url, data, options) => {
    return request({
      url,
      data,
      method: item,
      ...options,
    });
  };
});
export default request;

// http.interceptors.request.use((config) => {
//   let token = store.state.user.token;
//   if (token) {
//     config.headers["x-token"] = token;
//   }
//   return config;
// });

// 登录
// export function post(url, data) {
//   return new Promise((resolve, reject) => {
//     http
//       .post(url, data, {
//         headers: {
//           "Content-Type": "application/json",
//         },
//       })
//       .then(
//         (res) => {
//           resolve(res);
//         },
//         (err) => {
//           console.log("错误");
//           reject(err);
//         }
//       );
//   });
// }
